<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>es6 js面向对象的多态理解</title>
  <!-- 
  在JavaScript中，特别是使用ES6语法时，面向对象的多态（Polymorphism）是一种重要的特性，它允许不同类型的对象以相同的方式进行操作。多态性使得代码更加灵活和可扩展。
  1. 多态的基本概念
  多态是指同一操作可以作用于不同类型的对象。在JavaScript中，多态主要通过方法重写和动态类型实现。由于JavaScript是一种动态类型语言，任何对象都可以在运行时被赋予不同的属性和方法。

  2. 方法重写
  在ES6中，可以通过类和继承来实现方法重写。子类可以重写父类的方法，从而提供特定的实现。
  class Animal {
      speak() {
          console.log("Animal makes a sound");
      }
  }

  class Dog extends Animal {
      speak() {
          console.log("Dog barks");
      }
  }

  class Cat extends Animal {
      speak() {
          console.log("Cat meows");
      }
  }
  在这个例子中， `Dog` 和 `Cat` 类重写了 `Animal` 类的 `speak` 方法。

  3. 多态的实现
  多态通常通过父类引用指向子类对象来实现。这样可以在运行时根据对象的实际类型调用相应的方法。
  function makeSound(animal) {
      animal.speak(); // 根据实际对象调用相应的方法
  }

  const dog = new Dog();
  const cat = new Cat();

  makeSound(dog); // 输出: Dog barks
  makeSound(cat); // 输出: Cat meows
  在这个例子中， `makeSound` 函数接受一个 `Animal` 类型的参数，但可以传入任何 `Animal` 的子类对象。根据传入对象的类型，调用相应的 `speak` 方法。

  4. 多态的优点
  - 灵活性：多态允许程序在运行时决定调用哪个方法，增强了程序的灵活性。
  - 可扩展性：可以通过增加新的子类而不需要修改现有代码来扩展程序。
  - 代码重用：通过父类引用可以使用子类对象，减少了代码的重复。

  5. 总结
  在ES6中，多态是面向对象编程的一个核心特性，通过方法重写和动态类型实现。多态性使得代码更加灵活、可扩展和可维护。在实际开发中，合理利用多态性可以提高代码质量和开发效率。通过使用类和继承，JavaScript开发者可以实现类似于其他面向对象语言的多态特性。
   -->
</head>
<body>

  <script>
    // 多态的表现: JS到处都是多态
    function sum(a, b) {
      return a + b;
    }

    sum(1, 2); // 3
    
    // 多态的表现
    let bar = 1234
    bar = 'hello world'
    console.log(bar.split()); // ['hello', 'world']

    bar = {
      running: function() {
        console.log('running')
      }
    }
    bar.running(); // running
    bar = []
    console.log(bar.length); // 0
    
  </script>
  
</body>
</html>